EventBridge を使って特定の IP 以外からのアクセスキー利用をメール通知してみる

EventBridge を使って特定の IP 以外からのアクセスキー利用をメール通知してみる

EventBridge を利用して、特定の IP アドレス以外からアクセスキーが利用された際にメール通知が送信されるように設定を行ってみました。 普段とは異なる IP アドレスからのアクセスキー利用を監視することができ、不審な利用の早期発見やセキュリティポリシーの見直しに活用できます。
Clock Icon2024.11.16

皆様いかがお過ごしでしょうか。
AWS 事業本部の平根です。
EventBridge を利用して特定の IP アドレス以外からアクセスキーが利用された際にメール通知されるように設定してみる機会がありましたので、ご紹介したいと思います。

設定の概要

EventBridge を利用して、特定の IP アドレス以外からアクセスキーが利用された場合に検知するように設定します。
CloudTrail の API アクションを検知対象とし、検知内容は SNS でメール通知されるように設定します。
EventBridge の「リージョン間のイベント送受信機能」を利用して、複数リージョンの EventBridge で検知されたイベントを東京リージョンの EventBridge へ集約して SNS でのメール通知を行います。
今回の構成の概要を以下の図に示します。

EventBridgeAcceskey.drawio

今回の構成では、アクセスキー利用のイベントを受信する各リージョンの EventBridge(sender)と、各リージョンから転送されてきたイベントを受信する EventBridge(receiver)をそれぞれ設定しています。
EventBridge(receiver)にてメール通知対象のイベントパターンの設定を行います。
EventBridge(sender)ではデフォルトのイベントバスを利用し、EventBridge(receiver)ではデフォルトバスとの重複検知を避けるためにカスタムバスを設定します。

本記事では以下の記事を参考に、複数リージョンに対して EventBridge を設定しています。

https://dev.classmethod.jp/articles/eventbridge-cross-region-expands/

前提

以下の設定はすでに実施済みの状態です。

  • メール通知用の Amazon SNS トピック、サブスクリプションの作成
  • AWS CloudTrail 証跡の設定
    • 今回は AWS CloudTrail に記録されたログを利用して通知を行います
  • EventBridge(Sender)で利用する IAM ロールの作成
    • EventBridge(Sender)で設定する以下の IAM ロールを事前に作成しています
信頼されたエンティティ
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "TrustEventBridgeService",
            "Effect": "Allow",
            "Principal": {
                "Service": "events.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "自身のアカウント ID"
                }
            }
        }
    ]
}
許可ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ActionsForResource",
            "Effect": "Allow",
            "Action": [
                "events:PutEvents"
            ],
            "Resource": [
                "arn:aws:events:ap-northeast-1:"アカウント ID":event-bus/*"
            ]
        }
    ]
}

設定手順

EventBridge で行った設定をご紹介します。

注意事項:今回の EventBridge では読み取り専用 API コールは検知されません

今回の設定では、読み取り専用 API コール(Describe や List)は検知対象外としていますのでご注意ください。
読み取り専用 API コールも検知したい場合は EventBridge のルールにてオプトイン設定を行う必要があります(AWS CLIおよび AWS CloudFormation テンプレートのみで設定が可能ですが、本記事では取り扱いません)。
読み取り専用 API コールの検知をオプトインする方法については [1] を参考にしてください。
[1] : [アップデート] EventBridge イベントバスが CloudTrailからの read-only API アクションを監視できるようになりました

EventBridge(receiver)の作成

カスタムイベントバスの作成

「イベントバスの作成」で EventBridge(receiver)用のカスタムイベントバスを作成します。

カスタムイベントバス作成-3

今回は東京リージョンに「eventbrdge-bus-receiver」という名前のカスタムイベントバスを作成しました。
ここで作成したカスタムイベントバスの Arn は EventBridge(Sender)の設定時に利用しますので控えておいてください。

ルール作成

EventBridge にて「ルール」を作成します。
イベントバスには先ほど作成したカスタムイベントバスを指定します。

ルール設定(receiver)

イベントパターンの設定

以下の記事 [2] を参考に EventBridge のルール設定を行なっていきます。
[2] : IAM アクセスキーが使用されたタイミングを知るための、アラートの設定方法を教えてください。

イベントソースに「その他」を指定します。

ルール設定イベントソースにその他を指定

イベントパターンには以下を入力します。

{
  "detail-type": ["AWS API Call via CloudTrail"],
  "detail": {
    "userIdentity": {
      "accessKeyId": ["AKIxxx"]
    },
    "sourceIPAddress": [{
      "anything-but": {
        "prefix": ["xxx.xxx."]
      }
    }]
  }
}

上記のイベントパターンでは、特定の Accesskey を利用して実行された API コールが CloudTrail に記録された場合に検知されます。
AKIxxx には検知対象のアクセスキー ID を記載してください。
また、anythingbut のプレフィックスマッチングを利用して source IP アドレスが特定の範囲以外の場合に検知されるように設定します。
※IP アドレスマッチング("cidrIp": [{ "cidr": "0.0.0.0/0" }]のような形式)を使用していないのは、anything-but 内での IP アドレスマッチングの使用がサポートされていない [3] ためです。

[3] : Amazon EventBridge のイベントパターンで使用する比較演算子 - Anything-but matching マッチング

ターゲットの選択

SNS を利用したメール通知を行うため、ターゲットにはあらかじめ作成しておいた メール通知用の SNS トピックを設定します。

ルール設定:ターゲットにSNSを設定

入力トランスフォーマー

検知された内容をそのままメール通知すると json 表記となっていて見づらいため、入力トランスフォーマーを利用して整形します。
ターゲットを選択画面の "追加設定" から設定できるターゲット入力トランスフォーマーの入力パスに以下を設定します。

{
  "accessKeyId": "$.detail.userIdentity.accessKeyId",
  "accountID": "$.detail.userIdentity.accountId",
  "eventID": "$.detail.eventID",
  "eventName": "$.detail.eventName",
  "eventSource": "$.detail.eventSource",
  "eventTime": "$.detail.eventTime",
  "region": "$.region",
  "sourceIPAddress": "$.detail.sourceIPAddress"
}

ターゲット入力トランスフォーマーのテンプレートには以下を設定します。

"通常とは異なる IP アドレスからのアクセスキー利用を検知しました"
"Account ID : <accountID> "
"AccessKey ID : <accessKeyId> "
"リージョン : <region> "
"実行されたイベント : <eventName> "
"ソースIPアドレス : <sourceIPAddress> "
"イベントソース : <eventSource> "
"発生時間 : <eventTime> "
"イベント ID : <eventID> "

その他の設定はデフォルトとし、ルールの作成を行います。

EventBrideg(sender)の作成

アクセスキー利用を通知したい全てのリージョンについて、EventBrideg(sender) の設定を行います。
複数リージョンへ一括で設定する方法については後述の "補足:CloudFormation テンプレートを利用した EventBrideg(sender)の作成" をご参照ください。

ルール作成

EventBridge の「ルールの作成」から、今回の通知設定のルールを作成していきます。
イベントバスにはデフォルトのイベントバスを指定します。

ルール設定イベントバスデフォルトを指定

イベントパターンの設定

イベントソースに「その他」を指定します。

ルール設定:パターンその他

イベントパターンには以下を入力します。

{
  "detail-type": ["AWS API Call via CloudTrail"],
  "detail": {
    "userIdentity": {
      "accessKeyId": ["AKIxxx"]
    }
  }
}

上記のイベントパターンでは、特定の Accesskey を利用して実行された API コールが CloudTrail に記録された場合に検知されます。
IP アドレスは receiver の方でフィルタリングするため、ここでは広く設定します。
ただし、リージョン間のイベント転送には費用が発生し、すべてのイベントを検知対象すると転送イベント数が多くなり料金が高騰する可能性があるため、今回は Accesskey でフィルターをしています。
(※発行されたカスタムイベントの料金|100 万件あたり USD 1.00 [4])

このように設定することで、検知対象外とする IP アドレスの範囲に変更があった場合に EventBridge(receiver)のみの設定変更で対応可能になります。

[4] : Amazon EventBridge の料金

ターゲットの選択

東京リージョンに作成した EventBridge(receiver)を指定します。
※別のリージョンに EventBrideg(sender) 作成する場合には、東京リージョンに作成したカスタムイベントバスの Arn を指定します。

ルール設定:ターゲットにreceiver

その他の設定はデフォルトとし、ルールの作成を行います。

補足:CloudFormation テンプレートを利用した EventBrideg(sender)の作成

上記ではコンソール上から EventBrideg(sender) を設定しましたが、CloudFormation StackSets を利用して複数リージョンに対して一括で EventBrideg(sender)を設定することもできます。
CloudFormation テンプレートを以下にご紹介します。

EventBrideg(sender) の CloudFormation テンプレート例
AWSTemplateFormatVersion: '2010-09-09'
Description: >-
  CloudFormation template for EventBridge
  Ruleeventbridge-AcceskeyUsed-rule-sender
Resources:
  Rule4410fbe3:
    Type: AWS::Events::Rule
    Properties:
      Name: eventbridge-AcceskeyUsed-rule-sender
      EventPattern: >-
        {"detail-type":["AWS API Call via
        CloudTrail"],"detail":{"userIdentity":{"accessKeyId":["AKIAxxx"]}}}
      State: ENABLED
      Description: eventbridge-AcceskeyUsed-rule-sender
      EventBusName: default
      Targets:
        - Id: Id8a0632b7-xxx-xxx-xxx
          Arn:
            Fn::Sub: >-
              arn:${AWS::Partition}:events:ap-northeast-1:${AWS::AccountId}:event-bus/eventbrdge-bus-receiver
          RoleArn: >-
            arn:aws:iam::xxx:role/service-role/Amazon_EventBridge_Invoke_Event_Bus_20241013
Parameters: {}

既存の EventBridge ルールから CloudFormation テンプレートを作成することができます [5]。
StackSets による複数リージョンへのデプロイは記事 [6] の手順に沿って実施可能です。

[5] : [アップデート]Amazon EventBridgeルール作成をよりシンプルにする機能が追加されました
[6] : CloudFormation StackSetsで複数アカウント・複数リージョンへ簡単にデプロイする

動作確認

EventBridge(receiver)のイベントパターン内の anything-but で指定した IP アドレス範囲外の IP から API コールを行うと、メール通知がされました。
以下の例は、バージニアリージョン(us-east-1)にて RunInstances を行なった場合の検知結果です。

"通常とは異なる IP アドレスからのアクセスキー利用を検知しました"
"Account ID : xxxxxxxx "
"AccessKey ID : AKIxxx "
"リージョン : us-east-1 "
"実行されたイベント : RunInstances "
"ソースIPアドレス : 100.xxx.xxx.xxx "
"イベントソース : ec2.amazonaws.com "
"発生時間 : 2024-10-22T22:24:57Z "
"イベント ID : fba272f1-xxx-xxx-xxx-xxx "

まとめ

EventBridge を利用して、複数のリージョンにおいて特定の IP アドレス以外からアクセスキーが利用された際にメール通知が送信されるように設定を行いました。
普段とは異なる IP アドレスからのアクセスキー利用を監視することができ、不審な利用の早期発見やセキュリティポリシーの見直しに役立つのではないでしょうか。

この記事がどなたかのお役に立つと幸いです。
以上、ヒラネでした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.